package com.jues.amaplibrary;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.util.Log;
import android.widget.Toast;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Android Studio .
 * 作者：zhong
 * 日期：2018/12/1
 * 邮箱：15206394364@163.com
 * 介绍：搞得地图工具类
 * 修订：====================
 */
public class AMapHelper {
    private static AMapHelper mapHelper;

    private AMapHelper() {
    }

    public static AMapHelper getInstance() {
        if (null == mapHelper) mapHelper = new AMapHelper();
        return mapHelper;
    }

    /**
     * @param context          context
     * @param locationListener 单次客户端的定位监听
     */
    public void getLocation(Context context, LocationListener locationListener) {
        AMapLocationClient locationClientSingle = new AMapLocationClient(context);

        AMapLocationClientOption locationClientSingleOption = new AMapLocationClientOption();
        //获取一次定位结果：
        //该方法默认为false。
        locationClientSingleOption.setOnceLocation(true);
        //关闭缓存机制
        locationClientSingleOption.setLocationCacheEnable(false);
        //给定位客户端对象设置定位参数
        locationClientSingle.setLocationOption(locationClientSingleOption);
        Log.d("开始定位", "Start");
        //启动定位
        locationClientSingle.startLocation();

        //locationClientSingle.setLocationListener(aMapLocation -> {
        //    if (aMapLocation != null) {
        //        switch (aMapLocation.getErrorCode()) {
        //            //0、定位成功
        //            case 0:
        //            case 1:
        //            case 2:
        //            case 4:
        //            case 5:
        //            case 6:
        //            case 8:
        //                //Toast.makeText(context, aMapLocation.getCity(), Toast.LENGTH_SHORT).show();
        //                locationListener.onLocationChanged(aMapLocation);
        //                break;
        //            default:
        //                Toast.makeText(context, "定位失败", Toast.LENGTH_SHORT).show();
        //                locationListener.onLocationFail();
        //                break;
        //        }
        //    }
        //    Log.d("定位完成", "Complete");
        //});
    }

    /**
     * @param from   起点经纬度坐标，
     *               格式为: position=lon,lat[,name]
     * @param to     终点经纬度坐标，
     *               格式为: position=lon,lat[,name]
     * @param via    途径点经纬度坐标，
     *               格式为: position=lon,lat[,name]
     * @param mode   出行方式：
     *               驾车：mode=car,
     *               公交:：mode=bus；
     *               步行：mode=walk；
     *               骑行：mode=ride；
     * @param policy 当mode=car(驾车):
     *               0:推荐策略,
     *               1:避免拥堵,
     *               2:避免收费,
     *               <p>
     *               callnative 是否尝试调起高德地图APP并在APP中查看，0表示不调起，1表示调起, 默认值为0
     * @return String Uri地址
     */
    public String navigation(Context context, String from, String fromTitle, String to, String toTitle, String via, String mode, int policy) {
        StringBuilder builder = new StringBuilder();
        builder.append("https://uri.amap.com/navigation?")
                .append("from=").append(from).append(",").append(fromTitle)
                .append("&to=").append(to).append(",").append(toTitle);
        if (null != via && !via.equals(""))
            builder.append("&via=").append(via).append(",");
        builder.append("&mode=").append(mode)
                .append("&policy=").append(policy)
                .append("&src=").append("商基因");
        if (isAvilible(context, "com.autonavi.minimap"))
            builder.append("&callnative=").append(1);
        else builder.append("&callnative=").append(0);
        return builder.toString();
    }

    /**
     * @param slat 起点经纬度坐标，
     * @param slon .
     * @param dlat 终点经纬度坐标，
     * @param dlon .
     * @param t    t = 0（驾车）= 1（公交）= 2（步行）= 3（骑行）= 4（火车）= 5（长途客车）
     * @return String Uri地址
     * amapuri://route/plan/?sid=BGVIS1&slat=39.92848272&slon=116.39560823&sname=A&did=BGVIS2&dlat=39.98848272&dlon=116.47560823&dname=B&dev=0&t=0
     */
    public String navigationApp(Context context, String slat, String slon, String dlat, String dlon, String t) {
        StringBuilder builder = new StringBuilder();
        builder.append("amapuri://route/plan/?")
                .append("&slat=").append(slat)
                .append("&slon=").append(slon)
                .append("&dlat=").append(dlat)
                .append("&dlon=").append(dlon)
                .append("&dev=").append(0)
                .append("&t=").append(t)
                .append("&sourceApplication=").append(0);
        return builder.toString();
    }

    /**
     * 百度地图 com.baidu.BaiduMap
     * 高德地图 com.autonavi.minimap
     *
     * @param context     context
     * @param packageName 应用包名
     * @return 是否包含 packageName 应用
     */
    public boolean isAvilible(Context context, String packageName) {
        //获取packagemanager
        final PackageManager packageManager = context.getPackageManager();
        //获取所有已安装程序的包信息
        List<PackageInfo> packageInfos = packageManager.getInstalledPackages(0);
        //用于存储所有已安装程序的包名
        List<String> packageNames = new ArrayList<String>();
        //从pinfo中将包名字逐一取出，压入pName list中
        if (packageInfos != null) {
            for (int i = 0; i < packageInfos.size(); i++) {
                String packName = packageInfos.get(i).packageName;
                packageNames.add(packName);
            }
        }
        //判断packageNames中是否有目标程序的包名，有TRUE，没有FALSE
        return packageNames.contains(packageName);
    }


    public interface LocationListener {
        void onLocationChanged(AMapLocation location);

        void onLocationFail();
    }

    //0
    //定位失败
    //请通过AMapLocation.getErrorCode()方法获取错误码，并参考错误码对照表进行问题排查。
    //
    //1
    //GPS定位结果
    //通过设备GPS定位模块返回的定位结果，精度较高，在10米－100米左右
    //
    //2
    //前次定位结果
    //网络定位请求低于1秒、或两次定位之间设备位置变化非常小时返回，设备位移通过传感器感知。
    //
    //4
    //缓存定位结果
    //返回一段时间前设备在同样的位置缓存下来的网络定位结果
    //
    //5
    //Wifi定位结果
    //属于网络定位，定位精度相对基站定位会更好，定位精度较高，在5米－200米之间。
    //
    //6
    //基站定位结果
    //纯粹依赖移动、联通、电信等移动网络定位，定位精度在500米-5000米之间。
    //
    //8
    //离线定位结果
}
